#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//char* my_strncpy(char* p1,const char* p2,int n)
//{
//	for (int i = 0; i < n; i++)
//	{
//		*(p1 + i) = *(char*)(p2 + i);
//	}
//	return p1;
//}
//
//int main()
//{
//	char str1[] = "ABCDEF";
//	char str2[] = "XXXXXXXXX";
//	printf("%s\n", my_strncpy(str1, str2, 4));
//	return 0;
//}

//char* strncat(char* p1,char* p2,int n)
//{
//	while (*p1 != '\0')
//	{
//		p1++;
//	}
//	for (int i = 0; i < n; i++)
//	{
//		*(p1 + i) = *(p2 + i);
//	}
//}
//int main()
//{
//	char str1[256] = "ABCDEF";
//	char str2[] = "XXXXXXXXX";
//	strncat(str1,str2,3);
//	printf("%s", str1);
//	return 0;
//}


//int my_strlen(char* s)
//{
//	assert(s);
//	char* p = s;
//	while (*p != '\0')
//		p++;
//	return p - s;
//}
//
//int main()
//{
//	char s[] = "abcd";
//	printf("%d", my_strlen(s));
//	return 0;
//}


//int func(int* a)
//{
//	char* b = (char*)a;
//	if (b == 0x44)
//		return 0;
//	else
//		return 1;
//}
//int main()
//{
//	int* a = 0x11223344;
//	printf("%d", func(a));
//	return 0;
//}
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char s1[] = "ABCD";
//	char s2[] = "BC";
//	printf("%p", strstr(s1, s2));
//	return 0;
//}


//int main()
//{
//	int str1[] = { 1,2,3,4,5 };
//	int str2[] = { 1,2,5,2,1 };
//	printf("%d", memcmp(str1, str2, 4*4));
//	return 0;
//}


//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char str[] = "hello world";
//	memset(str, '9', 6);
//	printf(str);
//	return 0;
//}

//
//char* my_strncat(char* p1, const char* p2, int n)
//{
//	char* tmp = p1;
//	while (*p1 != '\0')
//	{
//		p1++;
//	}
//	for (int i = 0; i < n && *p2 != '\0'; i++)
//	{
//		*p1 = *p2;
//		p1++;
//		p2++;
//	}
//	return tmp;
//}
//
//int main()
//{
//	char s1[256] = "ABCDE";
//	char s2[] = "abcde";
//	printf("%p\n", my_strncat(s1, s2, 3));
//	printf("%s\n", s1);
//	return 0;
//}


//void* my_memcpy(void* p1, const void* p2, int n)
//{
//	for (int i = 0; i < n; i++)
//	{
//		*((char*)p1+i) = *((char*)p2 + i);
//	}
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 6,7,8,9,10 };
//	my_memcpy(arr1,arr2,4);
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	for (int i = 0; i < sz; i++)
//	{
//		printf("%d", arr1[i]);
//	}
//	return 0;
//}

void* my_memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count)) 
	{
		while (count--) 
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else 
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--) 
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	my_memmove(arr1 + 2, arr1, 12);
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d", arr1[i]);
	}
	return 0;
}